package dao

import (
	"errors"
	"user_srv/basic/config"
	"user_srv/handler/models"
)

// SendChatMessage 发送聊天消息并保存到数据库
// 参数：matchId - 匹配ID, senderId - 发送者ID, receiverId - 接收者ID, content - 消息内容, messageType - 消息类型
// 返回：创建的消息对象和错误信息
func SendChatMessage(matchId, senderId, receiverId uint64, content string, messageType int8) (*models.ChatMessage, error) {
	// 1. 验证匹配关系是否存在且有效
	isValid, err := CheckMatchValid(matchId, senderId, receiverId)
	if err != nil {
		return nil, err
	}
	if !isValid {
		return nil, errors.New("匹配关系无效或已解除，无法发送消息")
	}

	// 2. 验证消息内容
	if content == "" {
		return nil, errors.New("消息内容不能为空")
	}

	// 3. 验证消息类型
	if messageType < 1 || messageType > 4 {
		messageType = 1 // 默认为文本消息
	}

	// 4. 创建消息记录
	message := models.ChatMessage{
		MatchId:     matchId,
		SenderId:    senderId,
		ReceiverId:  receiverId,
		Content:     content,
		MessageType: messageType,
		IsRead:      0, // 默认未读
	}

	err = message.Create()
	if err != nil {
		return nil, errors.New("保存消息失败：" + err.Error())
	}

	return &message, nil
}

// CheckMatchValid 检查匹配关系是否有效
// 参数：matchId - 匹配ID, user1Id - 用户1ID, user2Id - 用户2ID
// 返回：是否有效和错误信息
func CheckMatchValid(matchId, user1Id, user2Id uint64) (bool, error) {
	var match models.MatchRecord

	// 查询匹配记录，验证双方用户ID和匹配状态
	err := config.DB.Where("id = ? AND ((user1_id = ? AND user2_id = ?) OR (user1_id = ? AND user2_id = ?)) AND status = 1",
		matchId, user1Id, user2Id, user2Id, user1Id).First(&match).Error

	if err != nil {
		if err.Error() == "record not found" {
			return false, nil
		}
		return false, errors.New("查询匹配记录失败：" + err.Error())
	}

	return true, nil
}

// GetChatHistory 获取聊天历史记录
// 参数：matchId - 匹配ID, userId - 当前用户ID, page - 页码, pageSize - 每页数量
// 返回：消息列表、总数和错误信息
func GetChatHistory(matchId, userId uint64, page, pageSize int) ([]models.ChatMessage, int64, error) {
	// 1. 验证用户是否是该匹配的参与者
	var match models.MatchRecord
	err := config.DB.Where("id = ?", matchId).First(&match).Error
	if err != nil {
		return nil, 0, errors.New("匹配记录不存在")
	}

	if match.User1Id != userId && match.User2Id != userId {
		return nil, 0, errors.New("无权查看该聊天记录")
	}

	// 2. 查询聊天记录
	var chatMsg models.ChatMessage
	messages, total, err := chatMsg.GetByMatchId(matchId, page, pageSize)
	if err != nil {
		return nil, 0, errors.New("查询聊天记录失败：" + err.Error())
	}

	return messages, total, nil
}

// MarkChatAsRead 标记聊天消息为已读
// 参数：matchId - 匹配ID, userId - 当前用户ID（接收者）
// 返回：错误信息
func MarkChatAsRead(matchId, userId uint64) error {
	// 标记该会话中所有发给当前用户的未读消息
	err := models.MarkMessagesAsReadByMatch(matchId, userId)
	if err != nil {
		return errors.New("标记消息已读失败：" + err.Error())
	}
	return nil
}

// GetUnreadChatCount 获取用户的未读消息统计
// 参数：userId - 用户ID
// 返回：每个会话的未读消息数（key: matchId, value: count）和错误信息
func GetUnreadChatCount(userId uint64) (map[uint64]int64, error) {
	unreadMap, err := models.GetUnreadCount(userId)
	if err != nil {
		return nil, errors.New("获取未读消息统计失败：" + err.Error())
	}
	return unreadMap, nil
}

// GetOtherUserId 获取匹配中的对方用户ID
// 参数：matchId - 匹配ID, currentUserId - 当前用户ID
// 返回：对方用户ID和错误信息
func GetOtherUserId(matchId, currentUserId uint64) (uint64, error) {
	var match models.MatchRecord
	err := config.DB.Where("id = ?", matchId).First(&match).Error
	if err != nil {
		return 0, errors.New("匹配记录不存在")
	}

	if match.User1Id == currentUserId {
		return match.User2Id, nil
	} else if match.User2Id == currentUserId {
		return match.User1Id, nil
	}

	return 0, errors.New("用户不属于该匹配")
}


